package com.ruoyi.system.enums;

import lombok.Getter;

/**
 * 消息类型枚举
 * 用于消息推送和模板分类，定义了系统中支持的所有消息类型
 * 
 * @author ruoyi
 * @since 2024-01-01
 */
@Getter
public enum MsgTypeEnum {
    
    /**
     * 设计资料
     * 用于推送设计图纸、方案等设计相关文件
     */
    DESIGN_DATA(1, "设计资料"),
    
    /**
     * 主材清单
     * 用于推送主材清单、材料明细等采购相关信息
     */
    MATERIAL_LIST(2, "主材清单"),
    
    /**
     * 合同签署
     * 用于推送合同文件，要求用户签署确认
     */
    CONTRACT_SIGN(3, "合同签署"),
    
    /**
     * 验收信息
     * 用于推送施工验收通知，要求用户确认验收结果
     */
    ACCEPTANCE_INFO(4, "验收信息"),
    
    /**
     * 财务支付
     * 用于推送财务支付通知、发票等信息
     */
    FINANCIAL_PAYMENT(5, "财务支付"),
    
    /**
     * 验收单
     * 用于推送验收单填写消息
     */
    ACCEPTANCE_CHECKLIST(6, "阶段验收"),
    
    /**
     * 需求变更
     * 用于推送其他类型的消息
     */
     REQUIREMENT_CHANGE(7, "需求变更"),

    /**
     * 消息通知
     * 用于推送其他类型的消息
     */
    OTHER(99, "消息通知");

    /**
     * 消息类型代码
     */
    private final Integer code;
    
    /**
     * 消息类型描述
     */
    private final String description;

    /**
     * 构造函数
     * 
     * @param code 消息类型代码
     * @param description 消息类型描述
     */
    MsgTypeEnum(Integer code, String description) {
        this.code = code;
        this.description = description;
    }

    /**
     * 根据代码获取枚举
     * 
     * @param code 消息类型代码
     * @return 对应的枚举值，未找到返回null
     */
    public static MsgTypeEnum getByCode(Integer code) {
        for (MsgTypeEnum type : values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        return null;
    }

    /**
     * 根据描述获取枚举
     * 
     * @param description 消息类型描述
     * @return 对应的枚举值，未找到返回null
     */
    public static MsgTypeEnum getByDescription(String description) {
        for (MsgTypeEnum type : values()) {
            if (type.getDescription().equals(description)) {
                return type;
            }
        }
        return null;
    }

    /**
     * 根据代码获取描述
     * 
     * @param code 消息类型代码
     * @return 对应的描述，未找到返回null
     */
    public static String getDescription(Integer code) {
        MsgTypeEnum type = getByCode(code);
        return type != null ? type.getDescription() : null;
    }

    /**
     * 根据描述获取代码
     * 
     * @param description 消息类型描述
     * @return 对应的代码，未找到返回null
     */
    public static Integer getCode(String description) {
        MsgTypeEnum type = getByDescription(description);
        return type != null ? type.getCode() : null;
    }
}
